/**
 * 字符串trim工具类
 */
export class TrimUtil {
  /**
   * 对对象的所有字符串字段进行trim处理
   * @param obj 要处理的对象
   * @param excludeFields 排除的字段名数组
   * @returns 处理后的对象
   */
  static trimObjectFields<T>(obj: T, excludeFields: string[] = []): T {
    if (!obj || typeof obj !== 'object') {
      return obj;
    }

    const result = { ...obj } as any;
    
    for (const key in result) {
      if (result.hasOwnProperty(key) && !excludeFields.includes(key)) {
        const value = result[key];
        if (typeof value === 'string') {
          result[key] = value.trim();
        } else if (value && typeof value === 'object' && !Array.isArray(value)) {
          // 递归处理嵌套对象
          result[key] = this.trimObjectFields(value, excludeFields);
        }
      }
    }
    
    return result;
  }

  /**
   * 对数组中的每个对象进行trim处理
   * @param arr 要处理的对象数组
   * @param excludeFields 排除的字段名数组
   * @returns 处理后的数组
   */
  static trimArrayObjects<T>(arr: T[], excludeFields: string[] = []): T[] {
    if (!Array.isArray(arr)) {
      return arr;
    }
    
    return arr.map(item => this.trimObjectFields(item, excludeFields));
  }

  /**
   * 安全的字符串trim，处理null/undefined
   * @param str 要trim的字符串
   * @returns trim后的字符串或原值
   */
  static safeTrim(str: any): any {
    return typeof str === 'string' ? str.trim() : str;
  }

  /**
   * 批量trim多个字符串值
   * @param values 字符串值数组
   * @returns trim后的字符串数组
   */
  static trimMultiple(...values: any[]): any[] {
    return values.map(value => this.safeTrim(value));
  }
} 